home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 3: The Continuation / 17-Bit_The_Continuation_Disc.iso / amigan / amigan 16 / chatty / chatty.doc < prev    next >
Text File  |  1994-01-27  |  9KB  |  144 lines

  1.                                           This issue, we continue our quest for
  2.      From Issue 2, Volume III of          programming methods universally suited
  3.      the Amigan Apprentice &              for all Amigas, domestic and foreign,
  4.      Journeyman--John Toebes's            NTSC or PAL--and for whatever language
  5.      column, "Oh Say Can you C".          the user may speak (so long as it is
  6.                                           written from left to right in roman
  7.                                           characters). To illustrate how simple
  8. it is to write conformable code, I present the program listed on a separate in-
  9. sert sheet, CHATTY.C. It takes the form of a demo window for Workbench. It shows
  10. several features required in the design of a good program for an Amiga.
  11.  
  12. 1) It understands MOREROWS (and similar programs) and interlace.
  13.  
  14. 2) Its messages can be configured as the user specifies, without recompiling the
  15.    program.
  16.  
  17. 3) It multi-tasks well. Even though it prints random text, it does not hog the
  18.    CPU in a busy wait.
  19.  
  20. 4) When deactivated, it goes to sleep.
  21.  
  22.  Let's deal first with MOREROWS and similar programs. Last issue, we saw that
  23. information about the desired screen size is stored in GFXBASE. In our program,
  24. we take this information and combine it with the interlace field data stored in
  25. Preferences to calculate the Width and Height fields of our new window. This is
  26. much better than determining whether the machine is NTSC or PAL and adding the
  27. MOREROWS values ourselves (we can work on any default screen, no matter how big
  28. or small). When we open a window on the Workbench screen, however, we must re-
  29. spect the interlace bit and double window height accordingly.
  30.  
  31.  Changing Text: The most important part of this example is the method we use to
  32. change the text we display without having to recompile the program.  We do this
  33. by storing all message strings in the .info file that is asssociated with the
  34. program file. Last issue, I wrote that we could store such strings in a separate
  35. file. Is there a more appropriate place to store them than the .info file, which
  36. is always copied by Workbench? Neither programmer nor user ever must worry about
  37. the string file being always present and available.
  38.  
  39.   To see how strings are stored, simply click on any tool icon (the CLI one is a
  40. good one) and select the INFO option from the menu of Workbench, which will then
  41. display a window full of information about the CLI tool. Near the bottom of the
  42. window will be a string gadget labelled "tool types," with an up-down arrow on
  43. the left and an ADD/DEL gadget on the right. The arrows let you scroll through
  44. the tools; ADD/DEL enables you to add and delete tool types.
  45.  
  46.   The basic syntax for a tool is much like a BASIC assignment statement (as at
  47. the left, below). In this way, we can associate a string with any name. In Work-
  48.                   bench is a routine, FindToolType, which will search this list
  49. tool = string     of tool types and return the string associated with a given
  50.                   name.
  51.  
  52.   In this way, we can specify configuration parameters for a program, which can
  53. access those parameters by name. We can use this function to tailor a program--
  54. by having the program draw both messages and text strings from the tool types.
  55. All who use the program can revise the text of its messages with the INFO window
  56. of Workbench. There, they can change--to heart's content--whatever needs change.
  57. For a programmer, this means that a German language edition of a program demands
  58. only that the .info file be done with German messages.
  59.  
  60.  In Chatty.c, I use strings for only three things (see below). Although storing
  61.                                              strings in the tool types array has
  62. 1) A title for the window we open.           the advantage of configurability,
  63.                                              it has the disadvantage that the
  64. 2) An error message if we can't open it.     .info file must always be present
  65.                                              and that it have the right data in
  66. 3) Strings printed randomly in the window.   it. In Chatty.c, I have a default
  67.                                              title and message in English, plus
  68. a strings which is printed at random locations in varying colors. In the tool
  69. types array in the .info file we might have the material at left, below:
  70.  
  71. TITLE=whatever title you want                To make the demo short and easy to
  72. OPENFAIL=text when the window won't open     write, I don't use 26 strings. In-
  73. STRINGA=first text string                    stead, the seven strings (A - G) in
  74. ...more strings                              the .info file are printed at ran-
  75. STRINGZ=last text string [total, 26]         dom locations on the window. Were
  76.                                              all the strings used as error mes-
  77. sages or prompts in a working program, we'd have to pay more attention to their
  78. content and location.
  79.  
  80.  We access the strings with three simple steps:
  81.  
  82.    1) Open icon.library and store the base in IconBase.
  83.  
  84.    2) Locate the .info file and the directory it is stored in. We have two situ-
  85. ations to consider (always remember this!):
  86.  
  87.       a) In CLI, the program name is in argv[0]; the current directory is stored
  88. in the process structure.
  89.  
  90.       b) On Workbench, as we noted in past columns, Workbench passes us a start-
  91. up message that indicates our arguments and where they are located.
  92.  
  93.       Based on this information, we simply ask Workbench to get us the disk ob-
  94. ject (icon information) for our program.  In it is the tool types array pointer
  95. that we use.  The routine FindTools() gets this information for us from the di-
  96. rectory and name.
  97.  
  98.    3) For each string we are interested in, we call FindToolType() to search the
  99. tool types array. To make this easy to use, I've defined the routine getstr(),
  100. which acts like FindToolType() except that it takes a default string to return
  101. if none is found in the tool types array. In this way, we always have a string.
  102. When none is supplied, we use our default (sent as an argument); otherwise, we
  103. use what the user wants. The employment of getstr() is illustrated in the defin-
  104. ition of the macro M_CANTOPEN, below. In our code we do a puts(M_CANTOPEN), and
  105. it always works:
  106.  
  107.   #define M_CANTOPEN (getstr(toolptr, "OPENFAIL", "Can't Open the window"))
  108.  
  109.  Chatty.c uses few strings; in a more complex program, you'd want to define many
  110. names for the strings.  Nothing is wrong with numbering the messages (M1 through
  111. M99--or however many messages you need). Once you set up a method to identify a
  112. message, it's easy to extend it for all messages (even for titles and menus).
  113.  
  114.    For this demo, I stuffed the strings into the .info file from the INFO menu
  115. of Workbench. This would be tedious indeed if a program required several hundred
  116. messages and was issued in French, German, English and Spanish. We need a small
  117. program that will swiftly insert a list of messages into an .info file.
  118.  
  119.   We can take this one step further by allowing the user to enter configuration
  120. options, such as default window sizes and gadget locations. Do we face a serious
  121. limit on total string space in a a tool types array? The limit is 32K; it should
  122. not be a problem for most programs.
  123.  
  124.  Busy or Waiting? In a demo such as Chatty, many of us code an infinite loop and
  125. in it check for a message each pass through the loop. If a message isn't found,
  126. the loop continues. Although such loops are a friendly way to multi-task, they
  127. often perform operations too often or waste CPU cycles while they wait for some-
  128. thing to happen.
  129.  
  130.   One way around this is to use the timer (see the source code for PopCLI and
  131. MemWatch). The method is simple; you can suspend operation for a fixed period
  132. and let the system wake you up. Yet, Intuition provides a much simpler mechanism
  133. in the INTUITICKS IDCMP flag.  When you enable this, Intuition will send you a
  134. message (about 30 times a second or so) so long as your window is active. If you
  135. base your work on messages received, you regulate how much CPU time is consumed.
  136. More importantly, if your window is deactivated, the messages stop; the program
  137. effectively goes to sleep until a user again makes it active. This is the ulti-
  138. mate in CPU sharing for an application that deals only with a user and does lit-
  139. tle or no computation in the background.
  140.  
  141.   The INTUITICKS mechanism is not appropriate for every application, but if you
  142. do have a free-running loop around a getmsg call, you may as well take advantage
  143. of it to help regulate the amount of work.
  144.